import java.util.*;

/**
 * Clase de administracion de torres, el metodo processLine es quien realiza la logica
 * de negocios
 * @author Francisco
 *
 */
public class TorreManager {
	/**
	 * Lista de maestra de torres, es la que usara el administrador para guardar
	 * Nuevas torres, cada una contendra un enlace interior
	 */
	private List<Torre> list = new ArrayList<Torre>();

	/**
	 * Metodo para agregar torres en caso de que sea un Enlace
	 * @param line Linea a analizar del texto
	 */
	public void addTorre(String torreInicial, String torreFinal) {
		
		Torre primerTorre, torreEnlace;
		
		// Solo en caso de no existir la torre se agrega
		if (!existTorre(torreInicial)) {
			// Se agrega torre
			primerTorre = new Torre(torreInicial);
			list.add(primerTorre);
		}else{ //Obtenemos la torre para agregarle el enlace
			primerTorre = TorreHelper.getTorre(list, torreInicial);
		}
		
		if (!existTorre(torreFinal)){
			//Se agrega la torre
			torreEnlace = new Torre(torreFinal);
			
			list.add(torreEnlace);
		}else{
			torreEnlace = TorreHelper.getTorre(list, torreFinal);
		}
		
		//Llamamos al metodo para agregar enlaces
		primerTorre.addTorreLink(torreEnlace);
	}

	/**
	 * Metodo para eliminar un enlace
	 * @param line Linea a analizar para extraer torre inicial y torre enlace
	 */
	public void removeLink(String torreIn, String torreFin) {
		//Buscamos la torre en la lista
		Torre torreInicial = TorreHelper.getTorre(list, torreIn);
		Torre torreFinal = TorreHelper.getTorre(list, torreFin);
		
		if (torreInicial !=null && torreFinal != null){
				torreInicial.removeTorreLink(torreFinal);
		}
	}

	public String getRoute(String torreInicial, String torreFinal) {
		String route = "";
		
		//Ya con los nombres de las torres, verificamos primero de que existan ambas
		//En la lista maestra
		if (existTorre(torreInicial) && existTorre(torreFinal)){
			Torre torreInicialO = TorreHelper.getTorre(list, torreInicial);
			Torre torreFinalO = TorreHelper.getTorre(list, torreFinal);
			TorreHelper.clearPath();
			route = TorreHelper.getRoute(torreInicialO, torreFinalO);
		}
		
		//En cualquiera de estos 2 validacion no se encontro alguna ruta posible
		if (route.endsWith("=>  ") || route.isEmpty()){
			route = String.format("- %s => %s", torreInicial, torreFinal);
		}else{ //Se encontro una ruta, se pasa a poner el signo +
			route = String.format("+%s", route);
		}
		
		return route;
	}

	/**
	 * Metodo para evaluar si una torre existe en la lista
	 * @param nameTorre
	 * @return Un valor indicando que la torre existe en la lista maestra
	 */
	private boolean existTorre(String nameTorre) {
		Torre torre = TorreHelper.getTorre(list, nameTorre);
		
		return (torre!=null);
	}
}
